#ifndef PL_BT_LUA_BINDINGS_H
#define PL_BT_LUA_BINDINGS_H

#include "lua.hpp"
#include "../core/ObjectFactory.h"

class plbtBodyBind : public DataTypeBase
{
public:
static int li_getSlotId(lua_State* L);
static int li_setShape(lua_State* L);
static int li_addToWorld(lua_State* L);
static int li_removeFromWorld(lua_State* L);
static int li_setMass(lua_State* L);
static int li_setInertia(lua_State* L);
static int li_setPosition(lua_State* L);
static int li_setRotation(lua_State* L);
static int li_setLinearVelocity(lua_State* L);
static int li_setAngularVelocity(lua_State* L);
static int li_getPosition(lua_State* L);
static int li_getRotation(lua_State* L);
static int li_getLinearVelocity(lua_State* L);
static int li_getAngularVelocity(lua_State* L);
static int li_applyGlobalForce(lua_State* L);
static int li_applyLocalForce(lua_State* L);
static int li_applyGlobalTorque(lua_State* L);
static int li_applyLocalTorque(lua_State* L);
static int li_localPosToWorld(lua_State* L);
static int li_worldPosToLocal(lua_State* L);
static int li_localVecToWorld(lua_State* L);
static int li_worldVecToLocal(lua_State* L);
static int li_autoCalcInertia(lua_State* L);
static int li_finalizeBody(lua_State* L);
static int li_inWorld(lua_State* L);

static void pushStaticFuncs(lua_State* L);
void registerFunctions(lua_State* L);
};

class plbtConstrBind : public DataTypeBase
{
public:
static int li_addToWorld(lua_State* L);
static int li_removeFromWorld(lua_State* L);
static int li_setVector(lua_State* L);
static int li_setQuaternion(lua_State* L);
static int li_addBody(lua_State* L);
static int li_allowCollisions(lua_State* L);
static int li_setMotor(lua_State* L);
static int li_disableMotor(lua_State* L);
static int li_setLimits(lua_State* L);
static int li_numMotors(lua_State* L);
static int li_createHinge(lua_State* L);
static int li_createP2P(lua_State* L);
static int li_createSlider(lua_State* L);
static int li_createConeTwist(lua_State* L);

static void pushStaticFuncs(lua_State* L);
void registerFunctions(lua_State* L);
};

class plbtShapeBind : public DataTypeBase
{
public:
static int li_getRefCt(lua_State* L);
static int li_finalize(lua_State* L);
static int li_createBoxShape(lua_State* L);
static int li_createSphereShape(lua_State* L);
static int li_createCylinderShape(lua_State* L);
static int li_createCapsuleShape(lua_State* L);
static int li_createConeShape(lua_State* L);
static int li_createCompoundShape(lua_State* L);
static int li_addSubShape(lua_State* L);

static void pushStaticFuncs(lua_State* L);
void registerFunctions(lua_State* L);
};

#endif